package de.connecttext.deprecated;

import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * durchsucht das Verzeichnis. Eingabe: Pfadangabe Ausgabe: FileListe Folgt dem
 * Singleton-Pattern
 * 
 * @author conrad
 * 
 */
public class FileCrawler {

	private static FileCrawler instance;

	/**
	 * Extensions, die erlaubt sind. Files, die andere Extensions haben, werden
	 * nicht berücksichtigt.
	 */
	private Set<String> allowedExtensions;

	private FileCrawler() {
		instance = this;
		allowedExtensions = new HashSet<String>();
		allowedExtensions.add("txt");
		allowedExtensions.add("xml");
		allowedExtensions.add("dat");
	}

	/**
	 * Crawler nur einzeln benötigt, daher Singleton
	 * 
	 * @return Crawler-Instanz
	 */
	public static FileCrawler getInstance() {
		if (instance == null) {
			return new FileCrawler();
		}
		return instance;
	}

	/**
	 * Wird aufgerufen, damit der Crawler ein Verzeichnis durchsucht
	 * 
	 * @param removedDirectories
	 * 
	 * @return ArrayList mit allen im Verzeichnis gefundenen Text-Dateien
	 */
	public List<File> getTextFiles(File directory) {
		return listFiles(directory);
	}

	/**
	 * 
	 * @param directory
	 * @return true, wenn die übergebene File den allowdExtensions enspricht
	 *         false otherwise
	 */
	private boolean isTextFile(File directory) {
		int lastDot = directory.getName().lastIndexOf(".");
		String endung = directory.getName().substring(lastDot + 1);
		if (allowedExtensions.contains(endung))
			return true;
		return false;
	}

	/**
	 * Durchsucht rekursiv das in directory angegebene Verzeichnis, ruft
	 * {@link recursiveListFiles} auf
	 * 
	 * @param directories
	 * 
	 * @return Liste aller Files im angegebenen Verzeichnis
	 */
	public List<File> listFiles(File directory) {
		List<File> toReturn = new ArrayList<File>();

		List<File> tempFileList = new ArrayList<File>();

		try {
			if (directory != null) {
				if (directory.isFile() && directory.canRead()
						&& isTextFile(directory)) {
					tempFileList.add(directory);
				} else if (directory.isDirectory()) {
					tempFileList = recursiveListFiles(directory);
				}

			} else {
				System.out.println("FILE NOT FOUND");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		toReturn.addAll(tempFileList);

		return toReturn;
	}

	/**
	 * Wird von {@link listFiles} aufgerufen, durchsucht rekursiv Verzeichnisse
	 * 
	 * @param directory
	 * @return
	 */
	private List<File> recursiveListFiles(File directory) {
		List<File> toReturn = new ArrayList<File>();
		File[] children = directory.listFiles();

		for (File file : children) {
			if (file.isFile() && file.canRead() && isTextFile(file)) {
				toReturn.add(file);
			} else if (file.isDirectory()) {
				toReturn.addAll(recursiveListFiles(file));
			}
		}
		return toReturn;
	}

	/**
	 * Löscht rekursiv
	 * 
	 * @param indexDir
	 */

	public void deleteFile(File indexDir) {
		try {
			if (indexDir != null) {
				if (indexDir.isFile() && indexDir.canRead()) {
					indexDir.delete();
				} else if (indexDir.isDirectory()) {
					deleteDirectory(indexDir);
					indexDir.delete();
				}

			} else {
				System.out.println("FILE NOT FOUND");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private void deleteDirectory(File indexDir) {
		File[] children = indexDir.listFiles();

		for (File file : children) {
			if (file.isFile()) {
				file.delete();
			} else if (file.isDirectory()) {
				deleteDirectory(file);
				file.delete();
			}
		}
	}

}
